package com.gamutsoft.amb.common.util;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * <h3>Class name</h3>
 * 页面分页
 * <h4>Description</h4>
 * 1.分页数据显示部份完全由用户自定义. 2.支持URL多个参数. 3.可自定义传递变量名称
 * <h4>Special Notes</h4>
 * <code>
 * 		调用范例：
 * 			Pagination.setPageSize(3); //每页显示条数. 
 * 			Pagination.setPages(request,"page",totalRecord); //设置分页. 
 * 			int totalPages = Pagination.getTotalPage();//取出总页数. 
 * 			int curPages = Pagination.getCurPage(); //取出当前页数.
 * </code>
 * 
 * @ver 2.0
 * @author Jay.Wu 2008-8-20
 */
public class PageUtil {
	/** 每页显示条数 */
	public static int PAGESIZE = 15;

	/** 重写请求地址参数名 */
	public static String PARAMETER_REWRITE_URL = "REWRITE_URL";
	
	/**
	 * 当前页码
	 */
	private int curPage;

	/**
	 * 设置每页显示的页数
	 */
	private int pageSize = -1;

	/**
	 * 总页数
	 */
	private int totalPage;

	/**
	 * 记录总数
	 */
	private int totalRecord;

	/**
	 * 当前记录位置
	 */
	private int offset;

	/**
	 * 网页中传递的参数名
	 */
	private String pageName = "page";

	/**
	 * 网页中传递的当前页码参数名
	 */
	private String curPageName = "curPage";

	/**
	 * 网页中传递的完整参数字符串值参数名
	 */
	private String fullParameterStringName = "Parameter";

	/**
	 * 存放参数-值的对应关系
	 */
	private Map<String, String> queryMap;

	/**
	 * 所有参数
	 */
	private String parameter;

	/**
	 * 所有参数
	 */
	private String postUrlParameter;

	private String hiddenPara;

	/**
	 * 从页面传进的原始页码
	 */
	private String strPage;

	/**
	 * 带所有参数的网址
	 */
	private String Url;

	protected HttpServletRequest request;
//
	public PageUtil() {
		this.curPage = 0;
		this.pageSize = PAGESIZE;
	}
//	
	public PageUtil(HttpServletRequest request) {
		this.request = request;
		this.pageSize = PAGESIZE;//设置每页显示条数
//		strPage = request.getParameter(pageName);
	}
//
//	public PageUtil(HttpServletRequest request, int pageSize) {
//		this.request = request;
//		strPage = request.getParameter(pageName);
//		setPageSize(pageSize);
//	}
//
//	/**
//	 * 
//	 * @param request
//	 * @param pageName
//	 *            设置传递分页参数的名字
//	 */
//	public PageUtil(HttpServletRequest request, String pageName) {
//		this.request = request;
//		this.pageName = pageName;
//		strPage = request.getParameter(pageName);
//	}
//
//	/**
//	 * 取出所有参数
//	 */
	public String getParameter() {
		return parameter!=null ? parameter : "";
	}
//
//	/**
//	 * 设置参数-值的对应关系
//	 * 
//	 * @param queryMap
//	 */
//	public void setQueryMap(Map<String, String> queryMap) {
//		this.queryMap = queryMap;
//	}

	/**
	 * 当前记录位置
	 */
	public int getOffset() {
		return offset;
	}

	/**
	 * 取出总页数
	 */
	public int getTotalPage() {
		return totalPage;
	}

	/**
	 * 取出每页显示纪录个数
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 取出总纪录个数
	 */
	public int getTotalRecord() {
		return totalRecord;
	}

	/**
	 * 取出当前页数
	 */
	public int getCurPage() {
		return curPage;
	}

	/**
	 * 取出上一页
	 */
	public int getPreviousPage() {
		return curPage - 1;
	}

	/**
	 * 取出下一页
	 */
	public int getNextPage() {
		return curPage + 1;
	}

	/**
	 * 取出参数Map
	 */
	public Map<String, String> getQueryMap() {
		return queryMap;
	}

	/**
	 * 取出分页参数
	 */
	public String getPageName() {
		return pageName;
	}

	/**
	 * 设置参数名称：当前页码
	 */
	public void setCurPageName(String curPageName) {
		this.curPageName = curPageName;
	}

	/**
	 * 设置参数名称：完整参数字符串
	 */
	public void setFullParameterStringName(String fullParameterStringName) {
		this.fullParameterStringName = fullParameterStringName;
	}

	/**
	 * 取出带所有参数的网址
	 */
	public String getUrl() {
		return Url;
	}

	/**
	 * 设置每页显示纪录个数
	 * 
	 * @param PageSize
	 */
	public void setPageSize(int PageSize) {
		// PageSize=0 一页显示所有记录
		if (PageSize < 0)
			this.pageSize = 0;
		else
			this.pageSize = PageSize;
	}

	/**
	 * 设置分页各项
	 * 
	 * @param pageSize
	 *            每页显示的页数
	 * @param totalRecord
	 *            记录总数
	 */
	public void setPages(int pageSize, int totalRecord) {
		setPageSize(pageSize);

		// 默认页数
		if (pageSize == -1)
			pageSize = 10;

		// 计算总页数
		this.totalRecord = totalRecord;

		// 若PageSize=0 则一页显示所有记录，即总页数为1,每页显示的页数=记录总数
		if (pageSize == 0) {
			totalPage = 1;
			pageSize = totalRecord;
		} else {
			if (totalRecord % pageSize == 0)
				totalPage = totalRecord / pageSize;
			else
				totalPage = totalRecord / pageSize + 1;
		}

		if (totalPage == 0) {
			totalPage = 1;
		}

		// 纠正strPage值
//		if (strPage == null) {
//			curPage = 1;
//		} else {
//			try {
//				curPage = Integer.parseInt(strPage);
//			} catch (Exception e) {
//				// 非数字
//				curPage = 1;
//			}
			// 小于1页
			if (curPage < 1)
				curPage = 1;
			// 超过总页数
			if (curPage > totalPage)
				curPage = totalPage;
//		}

//		countOffset();
//		getUrls();
	}

//	/**
//	 * 自动获取原网址中的参数，不带page参数
//	 * 
//	 * @param request
//	 * @return 返回全部参数
//	 */
//	@SuppressWarnings("unchecked")
//	public String getUrlsWithoutMap() {
//		Enumeration<String> queryString = request.getParameterNames();
//		String parameterName, parameterValue;
//		hiddenPara = "";
//
//		while (queryString.hasMoreElements()) {
//			parameterName = queryString.nextElement();
//			parameterValue = request.getParameter(parameterName);
//
//			// 自动过滤page相关内部参数
//			if (parameterName.equalsIgnoreCase(pageName))
//				continue;
//			if (parameterName.equalsIgnoreCase(curPageName))
//				continue;
//			if (parameterName.equalsIgnoreCase(fullParameterStringName))
//				continue;
//			if (parameterName.equalsIgnoreCase(PARAMETER_REWRITE_URL))
//				continue;
//
//			hiddenPara += "<input type=\"hidden\" name=\"" + parameterName + "\" id=\"" + parameterName + "\"  value=\"" + parameterValue + "\"/>\n";
//
//			if (parameter.equals(""))
//				parameter = "?" + parameterName + "=" + parameterValue;
//			else
//				parameter += "&" + parameterName + "=" + parameterValue;
//		}
//
//		return parameter;
//	}
//
//	/**
//	 * 生成指定页码的网址
//	 * 
//	 * @param request
//	 * @return 返回带全部参数的网页
//	 */
//	public String getUrls() {
//		if(request==null) return null;
//		//重写请求地址
//		//String rewriteURL = request.getParameter(PARAMETER_REWRITE_URL);
//		String rewriteURL = EnvironmentUtil.getInstance().getPropertyValue("REWRITE_URL");
//		Url = rewriteURL==null||rewriteURL.trim().equals("") ? request.getRequestURL().toString() : rewriteURL+request.getServletPath();
//		parameter = "";
//
//		if (queryMap != null) {
//			String parameterName, parameterValue;
//			Set<String> keySet = queryMap.keySet();
//			Iterator<String> key = keySet.iterator();
//
//			while (key.hasNext()) {
//				parameterName = key.next();
//				parameterValue = queryMap.get(parameterName);
//
//				hiddenPara += "<input type=\"hidden\" name=\"" + parameterName + "\" id=\"" + parameterName + "\"  value=\"" + parameterValue
//						+ "\"/>\n";
//
//				if (parameter.equals(""))
//					parameter = "?" + parameterName + "=" + parameterValue;
//				else
//					parameter += "&" + parameterName + "=" + parameterValue;
//			}
//		} else
//			parameter = getUrlsWithoutMap();
//
//		// 无其他参数
//		if (parameter.equals(""))
//			parameter = "?" + pageName + "=";
//		else
//			parameter += "&" + pageName + "=";
//
//		postUrlParameter = Url + "?" + pageName + "=";
//
//		Url = Url + parameter;
//
//		return Url;
//	}

	public String getHiddenPara() {
		return hiddenPara!=null ? hiddenPara : "";
	}

	public String getPostUrlParameter() {
		return postUrlParameter;
	}

	public void setPostUrlParameter(String postUrlParameter) {
		this.postUrlParameter = postUrlParameter;
	}

	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
	}

	/**
	 * 设置分页各项
	 */
	public void setPages() {
		setPages(pageSize, totalRecord);
	}

	/**
	 * @param curPage
	 */
	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}

	/**
	 * @param offset
	 *            the offset to set
	 */
	public void setOffset(int offset) {
		this.offset = offset;
	}

	public void countOffset() {
		offset = (curPage - 1) * pageSize;
	}

	/**
	 * @return the strPage
	 */
	public String getStrPage() {
		return strPage;
	}

	/**
	 * @param strPage
	 *            the strPage to set
	 */
	public void setStrPage(String strPage) {
		this.strPage = strPage;
	}
}
